
/**
 *
 * @author paco
 */
public class Token
{

	private int fila;
	private int columna;
	public static final Integer
			PARI = 1,
			PARD = 2,
			OPSUM = 3,
			OPMUL = 4,
			PYC = 5,
			ASIG = 6,
			DOUBLE = 7,
			INT = 8,
			MAIN = 9,
			LLAVEI = 10,
			LLAVED = 11,
			ENTERO = 12,
			ID = 13,
			REAL = 14,
			COMENTARIO = 15,
			EOF = 16,
			ERROR = 0;
	static public String Tipos[] =
	{
		"ERROR",
		"(",
		")",
		"opsum",
		"opmul",
		";",
		"=",
		"double",
		"int",
		"main",
		"{",
		"}",
		"entero",
		"id",
		"real",
		"comentario",
		"$"
	};
	static public String Salida[] =
	{
		"ERROR",
		" (",
		")",
		"opsum ",
		"opmul ",
		";\n",
		" = ",
		"double ",
		"int ",
		"main",
		"{\n",
		"}\n",
		"entero",
		"identificador",
		"real",
		"comentario",
		"$"
	};
	static public String SalidaError[] =
	{		
		"ERROR",
		"'('",
		"')'",
		"'+' o '-'",
		"'*' o '/'",
		"';'",
		"'='",
		"'double'",
		"'int'",
		"'main'",
		"'{'",
		"'}'",
		"entero",
		"identificador",
		"real",
		"comentario",
		"final de fichero"
	};
	private String cadena;	//Cadena que se muestra
	private int tipo;		//Tipo del token.

	/**
	 * Constructor.
	 * @param t Identificador del token
	 */
	public Token(int t)
	{
		tipo = t;
		cadena = Salida[t];
	}

	/**
	 * Constructor de token
	 * @param t Tipo de token.
	 * @param f Fila de inicio del token.
	 * @param c Columna en la que se encuentra el token.
	 */
	public Token(int t, int f, int c)
	{
		tipo = t;
		fila = f;
		columna = c;
		cadena = Tipos[t];
	}

	/**
	 * Constructor de token.
	 * @param p Cadena que muestra en token.
	 * @param t Identificador del tipo de token.
	 * @param f Fila de inicio del token.
	 * @param c Columna de inicio del token.
	 */
	public Token(String p, int t, int f, int c)
	{
		cadena = p;
		tipo = t;
		fila = f;
		columna = c;
	}

	/**
	 * Constructor de copia.
	 * @param t Objeto original.
	 */
	public Token(Token t)
	{
		cadena = t.cadena;
		tipo = t.tipo;
		fila = t.fila;
		columna = t.columna;
	}

	public String getError()
	{
		if (tipo <= 12)
		{
			return SalidaError[tipo];
		} else
		{
			if (cadena.equals(Salida[tipo]))
			{
				return SalidaError[tipo];
			}
			return "'" + cadena + "'";
		}

	}

	@Override
	public String toString()
	{
		String ret = "Token : Fila: " + fila + " Columna: " + columna + " \tTipo = " + Salida[tipo] + "\tCadena = " + cadena;


		return ret;
	}

	public int getFila()
	{
		return fila;
	}

	public int getColumna()
	{
		return columna;
	}

	public int getTipo()
	{
		return tipo;
	}

	public String getLexema()
	{
		return cadena;
	}

	@Override
	public boolean equals(Object obj)
	{
		if (obj == null)
		{
			return false;
		}
		if (getClass() != obj.getClass())
		{
			return false;
		}
		final Token other = (Token) obj;
		if (this.tipo != other.tipo)
		{
			return false;
		}
		return true;
	}

	@Override
	public int hashCode()
	{
		int hash = 7;
		hash = 47 * hash + this.tipo;
		return hash;
	}

	public boolean isEof()
	{
		return tipo == EOF;
	}
}
